// 实现add(1)(2)(3)
// 柯里化的作用
// 主要有3个作用： 参数复用、提前返回和 延迟执行
//参数复用：拿上面 f这个函数举例，只要传入一个参数 z，执行，计算结果就是 1 + 2 + z 的结果，
// 1 和 2 这两个参数就直接可以复用了。
//提前返回 和 延迟执行 也很好理解，因为每次调用函数时，它只接受一部分参数，并返回一个函数（提前返回），直到(延迟执行)传递所有参数为止。

function add(a, b, c) {
  return a + b + c
}
function curry(fn) {
  let total = fn.length
  return function innerFn(...args) {
    let innerLen = args.length // 传入参数的长度
    let innerArgs = args
    if (innerLen >= total) {
      return fn(...args)
    } else {
      return (...args) => innerFn(...innerArgs, ...args)
    }
  }
}
var addFn = curry(add)
console.log(addFn(1)(2, 3))